﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.UI.WebControls;
using Rendiciones.Web.infraestructura;
using System.Globalization;
using Rendiciones.Logica.Modelos;
using Rendiciones.Logica.Enumeradores;
using Tesla.Excepciones;

namespace Rendiciones.Web.Mantenedores.usercontrols
{
    public partial class ctrlEditorProyecto : UserControlBase
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        public void Mostrar(int idProyecto)
        {
            try
            {
                LimpiarErrores(pnlProyecto);
                CargarCombos();

                lblTitulo.Text = "Agregar Proyecto";
                var proyecto = new Proyecto();
                if (!idProyecto.Equals(0))
                {
                    lblTitulo.Text = "Editar Proyecto";
                    proyecto = Modulos.Rendiciones.Proyectos.Leer(idProyecto);
                }

                if (proyecto != null)
                {
                    IdProyecto = proyecto.IdProyecto;
                    Nombre = proyecto.Nombre;
                    CentroCosto = proyecto.CentroCosto;
                    Activo = proyecto.Activo;
                    IdGerente = proyecto.IdGerente;
                    IdAdministrador = proyecto.IdAdministrador;
                    Custodios = proyecto.Custodios;
                }
            }
            catch (Exception exception)
            {
                MuestraMensajeError(pnlProyecto, "<strong>Error:</strong> " + exception.Message);
            }
            mpeEditorProyecto.Show();
        }

        private void CargarCombos()
        {
            ddlIdGerente.Items.Clear();
            ddlIdAdministrador.Items.Clear();
            ddlCustodios.Items.Clear();
            
            var usuarios = Modulos.Rendiciones.Usuarios.Buscar(EAreaUsuario.Proyectos);
            if (usuarios.Count > 0)
            {
                ddlIdGerente.Items.Add(new ListItem("[seleccione Gerente...]", ""));
                ddlIdAdministrador.Items.Add(new ListItem("[seleccione Administador...]", ""));
                ddlCustodios.Items.Add(new ListItem("[seleccione Custodio...]", ""));
            }
            foreach (var usuario in usuarios)
            {
                ddlIdGerente.Items.Add(new ListItem(usuario.NombreCompleto, usuario.IdUsuario.ToString(CultureInfo.InvariantCulture)));
                ddlIdAdministrador.Items.Add(new ListItem(usuario.NombreCompleto, usuario.IdUsuario.ToString(CultureInfo.InvariantCulture)));
                ddlCustodios.Items.Add(new ListItem(usuario.NombreCompleto, usuario.IdUsuario.ToString(CultureInfo.InvariantCulture)));
            }
        }

        public void Ocultar()
        {
            mpeEditorProyecto.Hide();
        }

        protected void BtnCerrarEditorProyectoClick(object sender, EventArgs e)
        {
            Ocultar();
        }

        protected void BtnGuardarClick(object sender, EventArgs e)
        {
            try
            {
                LimpiarErrores(pnlProyecto);

                var proyecto = new Proyecto();
                proyecto.IdProyecto = IdProyecto;
                proyecto.Nombre = Nombre;
                proyecto.CentroCosto = CentroCosto;
                proyecto.Activo = Activo;
                proyecto.IdGerente = IdGerente;
                proyecto.IdAdministrador = IdAdministrador;
                proyecto.Custodios = Custodios;

                Modulos.Rendiciones.Proyectos.Guardar(ref proyecto);
                if (Page is Proyectos)
                    ((Proyectos)Page).Cargar();

                Ocultar();

                MostrarOk("Grabación Exitosa", "");
            }
            catch (ResultadoValidacionException resultadoValidacionException)
            {
                MuestraErroresDeValidacion(pnlProyecto, true, resultadoValidacionException);
            }
            catch (Exception exception)
            {
                MuestraMensajeError(pnlProyecto, "<strong>Error:</strong> " + exception.Message);
            }
        }

        protected void BtnCancelarClick(object sender, EventArgs e)
        {
            Ocultar();
        }

        protected void BtnAgregarClick(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(ddlCustodios.SelectedItem.Value))
                return;
            var custodios = Custodios;
            if(!custodios.Any(c => c.IdUsuario.Equals(int.Parse(ddlCustodios.SelectedItem.Value)))){
                var usuario = Modulos.Rendiciones.Usuarios.Leer(int.Parse(ddlCustodios.SelectedItem.Value));
                if(usuario != null)
                    custodios.Add(usuario);
            }
            Custodios = custodios;
        }

        private int IdProyecto
        {
            get { return string.IsNullOrEmpty(hdfIdProyecto.Value) ? 0 : int.Parse(hdfIdProyecto.Value); }
            set { hdfIdProyecto.Value = value.ToString(CultureInfo.InvariantCulture); }
        }
        private string Nombre { get { return txtNombre.Text.Trim(); } set { txtNombre.Text = value; } }
        private string CentroCosto { get { return txtCentroCosto.Text.Trim(); } set { txtCentroCosto.Text = value; } }
        private bool Activo { get { return chkActivo.Checked; } set { chkActivo.Checked = value; } }
        private int IdGerente 
        {
            get
            {
                return string.IsNullOrEmpty(ddlIdGerente.SelectedItem.Value) ? 0 : int.Parse(ddlIdGerente.SelectedItem.Value);
            }
            set
            {
                var index = 0;
                for (var i = 0; i < ddlIdGerente.Items.Count; i++)
                    if (value.ToString(CultureInfo.InvariantCulture).Equals(ddlIdGerente.Items[i].Value))
                        index = i;
                ddlIdGerente.SelectedIndex = index;
            }

        }
        private int IdAdministrador
        {
            get
            {
                return string.IsNullOrEmpty(ddlIdAdministrador.SelectedItem.Value) ? 0 : int.Parse(ddlIdAdministrador.SelectedItem.Value);
            }
            set
            {
                var index = 0;
                for (var i = 0; i < ddlIdAdministrador.Items.Count; i++)
                    if (value.ToString(CultureInfo.InvariantCulture).Equals(ddlIdAdministrador.Items[i].Value))
                        index = i;
                ddlIdAdministrador.SelectedIndex = index;
            }
        }
        private List<Usuario> Custodios
        {
            get
            {
                var usuarios = Modulos.Rendiciones.Usuarios.Buscar("");
                var custodios = new List<Usuario>();
                if (!string.IsNullOrEmpty(hdfCustodios.Value))
                {
                    foreach (var s in hdfCustodios.Value.Split(';'))
                    {
                        if(string.IsNullOrEmpty(s))
                            continue;
                        var usuario = usuarios.FirstOrDefault(u => u.IdUsuario.ToString(CultureInfo.InvariantCulture).Equals(s));
                        if(usuario != null)
                            custodios.Add(usuario);
                    }
                }
                return custodios;
            }
            set
            {
                var resultados = "";
                foreach (var usuario in value)
                {
                    if (!string.IsNullOrEmpty(resultados))
                        resultados += ";";
                    resultados += usuario.IdUsuario.ToString(CultureInfo.InvariantCulture);
                }
                hdfCustodios.Value = resultados;
                gvCustodios.DataSource = value;
                gvCustodios.DataBind();
            }
        }

        protected void GvCustodiosRowCommand(object sender, GridViewCommandEventArgs e)
        {
            var idUsuario = int.Parse(e.CommandArgument.ToString());
            switch (e.CommandName)
            {
                case "Eliminar":
                    var custodios = Custodios;
                    var usuario = Modulos.Rendiciones.Usuarios.Leer(idUsuario);
                    custodios = custodios.Where(c => !c.IdUsuario.Equals(usuario.IdUsuario)).ToList();
                    Custodios = custodios;
                    break;
            }
        }
    
    }
}